Skill

FastAPI এর বেস্ট প্র্যাকটিস এবং অ্যাডভান্সড টেকনিক

Web Development - ফাস্টএপিআই (FastAPI)
202

FastAPI হল একটি আধুনিক ও হাই পারফরম্যান্স ওয়েব ফ্রেমওয়ার্ক যা Python-এ দ্রুত এবং কার্যকর API তৈরি করার জন্য ব্যবহৃত হয়। এটি ডেভেলপমেন্টের জন্য অনেক সুবিধা প্রদান করে, তবে কিছু বেস্ট প্র্যাকটিস এবং অ্যাডভান্সড টেকনিক ব্যবহার করলে অ্যাপ্লিকেশন আরও কার্যকর এবং স্কেলেবল হতে পারে। এই গাইডে আমরা FastAPI এর কিছু বেস্ট প্র্যাকটিস এবং অ্যাডভান্সড টেকনিক নিয়ে আলোচনা করব।


বেস্ট প্র্যাকটিস

1. Proper Dependency Injection ব্যবহার করুন

FastAPI-তে Dependency Injection (DI) ব্যবহার করা খুবই গুরুত্বপূর্ণ। আপনি যেকোনো কাস্টম টাস্ক বা কম্পোনেন্টকে সহজেই ইনজেক্ট করতে পারেন। যেমন, ডাটাবেস সেশন, লগিং, তৃতীয় পক্ষের সার্ভিস ইত্যাদি।

উদাহরণ:

from fastapi import FastAPI, Depends
from sqlalchemy.orm import Session
from .database import get_db

app = FastAPI()

# Dependency to get the current user from the DB
def get_user(db: Session = Depends(get_db)):
    return db.query(User).first()

@app.get("/users/")
def read_users(user: User = Depends(get_user)):
    return {"username": user.username}

এখানে, Depends(get_user) Dependency Injection এর মাধ্যমে ডাটাবেস থেকে ব্যবহারকারী তথ্য এনে রাউটের জন্য ব্যবহার করা হয়েছে।

2. ডেটা ভ্যালিডেশন এবং টাইপ এনোটেশন

FastAPI স্বয়ংক্রিয়ভাবে Pydantic models ব্যবহার করে ডাটা ভ্যালিডেশন এবং টাইপ এনোটেশন চেক করে। তাই Pydantic মডেল তৈরি করে ডাটা ভ্যালিডেশন এবং ইনপুট যাচাই নিশ্চিত করতে হবে।

উদাহরণ:

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    price: float
    description: str | None = None

এখানে, Item মডেল ডাটা ভ্যালিডেশন করবে এবং নিশ্চিত করবে যে name এবং price অবশ্যই সঠিক টাইপের হবে।

3. ডকুমেন্টেশন সুসংহত করুন

FastAPI স্বয়ংক্রিয়ভাবে Swagger UI এবং ReDoc ডকুমেন্টেশন তৈরি করে, কিন্তু আপনি summary, description, example ইত্যাদি যোগ করে এটিকে আরও উন্নত করতে পারেন।

উদাহরণ:

@app.get("/items/{item_id}", summary="Get Item by ID", description="Retrieve an item by its ID.")
def read_item(item_id: int):
    return {"item_id": item_id}

এখানে, summary এবং description যোগ করার মাধ্যমে ডকুমেন্টেশন আরও পরিষ্কার করা হয়েছে।

4. Error Handling এবং Exception Management

যতটা সম্ভব custom error handling ব্যবহার করুন যাতে আপনি অ্যাপ্লিকেশনটিকে বেশি ব্যবহারকারী-বান্ধব এবং ইউজার-ফ্রেন্ডলি বানাতে পারেন।

উদাহরণ:

from fastapi import HTTPException

@app.get("/items/{item_id}")
def read_item(item_id: int):
    if item_id not in items_db:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item_id": item_id}

এখানে, যদি আইটেম না পাওয়া যায়, তবে 404 Not Found ত্রুটি ফেলা হয়।


অ্যাডভান্সড টেকনিক

1. Async / Await ব্যবহার করে অ্যাসিঙ্ক্রোনাস রিকোয়েস্ট

FastAPI অ্যাসিঙ্ক্রোনাস রিকোয়েস্ট হ্যান্ডল করার জন্য একদম উপযুক্ত। আপনি async/await ব্যবহার করে দীর্ঘ সময় নেয়া রিকোয়েস্ট (যেমন ডাটাবেস কল বা API কল) দ্রুত এবং পারফর্ম্যান্টভাবে হ্যান্ডেল করতে পারেন।

উদাহরণ:

import asyncio

@app.get("/long_task")
async def long_task():
    await asyncio.sleep(5)
    return {"message": "Task completed"}

এখানে, asyncio.sleep(5) ব্যবহার করা হয়েছে যাতে ৫ সেকেন্ডের জন্য প্রতীক্ষা করা হয়, কিন্তু অন্য রিকোয়েস্টগুলো প্রক্রিয়া চলতে থাকে।

2. Security Best Practices (JWT, OAuth2)

FastAPI তে OAuth2 বা JWT (JSON Web Token) এর মাধ্যমে নিরাপত্তা ব্যবস্থা বাস্তবায়ন করা হয়। JWT ব্যবহার করে টোকেন ভিত্তিক অথেনটিকেশন ও অথোরাইজেশন ব্যবস্থা তৈরি করতে পারেন।

উদাহরণ: JWT Authentication

from fastapi import Depends, HTTPException
from pydantic import BaseModel
import jwt

SECRET_KEY = "mysecretkey"

class User(BaseModel):
    username: str
    password: str

@app.post("/login")
def login(user: User):
    token = jwt.encode({"sub": user.username}, SECRET_KEY, algorithm="HS256")
    return {"access_token": token, "token_type": "bearer"}

@app.get("/protected")
def protected_route(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])
        return {"message": "Protected route accessed"}
    except jwt.PyJWTError:
        raise HTTPException(status_code=401, detail="Invalid token")

এখানে, JWT টোকেন ব্যবহার করে ব্যবহারকারীর অথেনটিকেশন এবং অথোরাইজেশন যাচাই করা হচ্ছে।

3. Database Optimizations with SQLAlchemy

FastAPI-তে SQLAlchemy ORM ব্যবহার করে ডাটাবেসের জন্য উন্নত অপটিমাইজেশন করা যায়। যেমন, Lazy Loading, Eager Loading, Indexed Columns ইত্যাদি।

উদাহরণ:

from sqlalchemy.orm import joinedload

@app.get("/users/")
def get_users(db: Session = Depends(get_db)):
    users = db.query(User).options(joinedload(User.posts)).all()
    return users

এখানে, joinedload ব্যবহার করে User এবং তার সাথে সম্পর্কিত Posts ডেটা একসাথে লোড করা হচ্ছে।

4. API Versioning

আপনার API-কে আরও রক্ষণশীলভাবে আপডেট করতে API versioning ব্যবহার করা উচিত, যাতে পুরনো ভার্সনের অ্যাপ্লিকেশনগুলো ঠিকভাবে কাজ করতে পারে।

উদাহরণ:

@app.get("/v1/items/")
async def get_items_v1():
    return {"version": "v1", "items": items}

@app.get("/v2/items/")
async def get_items_v2():
    return {"version": "v2", "items": items}

এখানে, API-এর v1 এবং v2 ভার্সন আলাদাভাবে সংজ্ঞায়িত করা হয়েছে, যাতে পরবর্তী আপডেটের সাথে পুরনো সংস্করণের অ্যাপ্লিকেশনগুলো সমস্যা না হয়।


5. Caching with FastAPI

Caching ব্যবহার করলে অ্যাপ্লিকেশনের পারফরম্যান্স বৃদ্ধি পায়। FastAPI-তে Redis বা Memcached ব্যবহার করে আপনার রিসোর্স-ইনটেনসিভ রিকোয়েস্টগুলোর জন্য ক্যাশিং সেটআপ করতে পারেন।

Redis caching উদাহরণ:

import redis

cache = redis.StrictRedis(host='localhost', port=6379, db=0)

@app.get("/cached-items")
async def get_cached_items():
    cached_items = cache.get("items")
    if cached_items:
        return {"items": cached_items}
    
    # No cache found, fetch from DB
    items = fetch_items_from_db()
    cache.set("items", items)
    return {"items": items}

এখানে, Redis ব্যবহার করে items ক্যাশ করা হচ্ছে যাতে পরবর্তী রিকোয়েস্টগুলো দ্রুত প্রক্রিয়া করা যায়।


FastAPI তে বেস্ট প্র্যাকটিস এবং অ্যাডভান্সড টেকনিক গুলি অনুসরণ করলে আপনার অ্যাপ্লিকেশন অনেক বেশি স্কেলেবল, পারফরম্যান্ট এবং নিরাপদ হয়ে উঠবে। Dependency Injection, Security, Database Optimization, Versioning, Caching, এবং Async Processing ব্যবহার করলে আপনি আধুনিক এবং শক্তিশালী API তৈরি করতে সক্ষম হবেন।

Content added By

Clean Code Structure এবং Project Organization

184

একটি প্রফেশনাল ও স্কেলেবল FastAPI প্রজেক্ট তৈরি করার জন্য Clean Code Structure এবং Proper Project Organization অপরিহার্য। একটি ভালো প্রজেক্ট স্ট্রাকচার ডেভেলপমেন্ট প্রক্রিয়াকে আরও কার্যকর, মেইনটেনেবল এবং স্কেলেবল করে তোলে। এটি কোড পুনঃব্যবহারযোগ্য, পরিস্কার এবং সহায়ক রাখে।

এই গাইডে আমরা FastAPI প্রজেক্টের clean code structure এবং proper project organization নিয়ে আলোচনা করবো, যাতে আপনি সহজেই বড় এবং জটিল অ্যাপ্লিকেশন তৈরি করতে পারেন।


Clean Code Structure কি?

Clean Code হল এমন কোড যা সহজে পড়া এবং বুঝতে সহজ হয়, এবং যেখানে সঠিক নামকরণ, যথাযথ ফাংশন ডিজাইন এবং ভাল ডকুমেন্টেশন থাকে। এতে সঠিক প্যাটার্ন এবং স্ট্যান্ডার্ড ব্যবহার করা হয় যা কোড মেইনটেন্যান্স সহজ করে এবং ফিচার অ্যাডিশন বা পরিবর্তন সহজ হয়।

FastAPI প্রজেক্টে Clean Code Structure:

  1. কোডের পরিষ্কার নামকরণ (Descriptive Naming)
  2. একটি সুসংহত মডুলার স্ট্রাকচার (Modular Architecture)
  3. অত্যধিক লজিক কন্ট্রোলের ভেঙে ফেলা (Avoiding Large Monolithic Functions)
  4. Error Handling এবং Validation
  5. Proper Use of Dependency Injection
  6. টেস্টিং এবং ডকুমেন্টেশন

FastAPI প্রজেক্টে Proper Project Organization

একটি সুসংগঠিত প্রজেক্ট স্ট্রাকচার অ্যাপ্লিকেশন ডেভেলপমেন্ট, টেস্টিং, স্কেলিং এবং মেইনটেন্যান্স সহজ করে তোলে। একাধিক ফোল্ডার এবং ফাইল স্ট্রাকচার ব্যবহার করা হয় যাতে আপনার কোডের সংগঠন সুনির্দিষ্ট ও মডুলার থাকে।

একটি সুনির্দিষ্ট FastAPI প্রজেক্ট স্ট্রাকচার

my_fastapi_project/
├── app/
│   ├── __init__.py
│   ├── main.py
│   ├── models/
│   │   ├── __init__.py
│   │   └── item.py
│   ├── schemas/
│   │   ├── __init__.py
│   │   └── item.py
│   ├── routes/
│   │   ├── __init__.py
│   │   └── item_routes.py
│   ├── services/
│   │   ├── __init__.py
│   │   └── item_service.py
│   ├── core/
│   │   ├── __init__.py
│   │   ├── config.py
│   │   └── security.py
│   ├── db/
│   │   ├── __init__.py
│   │   ├── database.py
│   │   └── session.py
├── tests/
│   ├── __init__.py
│   ├── test_item.py
├── requirements.txt
├── Dockerfile
└── README.md

ফোল্ডার এবং ফাইল ব্যাখ্যা:

1. app/main.py:

এটি FastAPI অ্যাপ্লিকেশনের মূল এন্ট্রি পয়েন্ট। এখানে FastAPI অ্যাপ অবজেক্ট তৈরি করা হয় এবং রাউট, মিডলওয়্যার, কনফিগারেশন সেটআপ করা হয়।

from fastapi import FastAPI
from .routes import item_routes

app = FastAPI()

# ইনক্লুড করা রাউট
app.include_router(item_routes.router)

2. app/routes/:

এই ফোল্ডারে FastAPI এর সব রাউট এবং এন্ডপয়েন্ট তৈরি করা হয়। এতে রাউটগুলো আলাদা ফাইল বা মডিউলে ভাগ করা হয়, যাতে কোড ক্লিন এবং মডুলার থাকে।

উদাহরণ: item_routes.py

from fastapi import APIRouter
from ..services.item_service import get_item

router = APIRouter()

@router.get("/items/{item_id}")
def read_item(item_id: int):
    return get_item(item_id)

3. app/services/:

এই ফোল্ডারটি কোডের কার্যকরী লজিক সংরক্ষণ করে। রাউট এবং কন্ট্রোলারগুলোর কাজ কমাতে এখানে সব সার্ভিস ফাংশন রাখা হয়, যাতে কোড সহজ এবং সুনির্দিষ্ট থাকে।

উদাহরণ: item_service.py

def get_item(item_id: int):
    # ডাটাবেস থেকে আইটেম বের করা বা অন্য কার্যাবলী
    return {"item_id": item_id, "name": "Item Name"}

4. app/models/:

এখানে ডাটাবেসের জন্য সব মডেল এবং ডাটাবেস টেবিলের কাঠামো রাখা হয়। সাধারণত SQLAlchemy বা Pydantic Models ব্যবহার করা হয়।

উদাহরণ: item.py

from pydantic import BaseModel

class Item(BaseModel):
    name: str
    description: str | None = None
    price: float

5. app/schemas/:

Schemas ফোল্ডারে ইনপুট এবং আউটপুট ভ্যালিডেশন সংক্রান্ত মডেল রাখা হয়। এখানে Pydantic মডেল ব্যবহার করা হয় যা API এর ইনপুট ডাটা যাচাই করে।

উদাহরণ: item.py

from pydantic import BaseModel

class ItemSchema(BaseModel):
    name: str
    description: str
    price: float

6. app/db/:

এই ফোল্ডারে ডাটাবেস সংযোগ এবং সেশন তৈরি করার জন্য কোড থাকে।

উদাহরণ: database.py

from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False})
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

7. tests/:

এই ফোল্ডারে টেস্টিং সম্পর্কিত ফাইল রাখা হয়। এখানে pytest ব্যবহার করে ইউনিট টেস্ট এবং ইন্টিগ্রেশন টেস্ট করা হয়।

উদাহরণ: test_item.py

from fastapi.testclient import TestClient
from app.main import app

client = TestClient(app)

def test_read_item():
    response = client.get("/items/1")
    assert response.status_code == 200
    assert response.json() == {"item_id": 1, "name": "Item Name"}

8. requirements.txt:

এই ফাইলটি আপনার প্রজেক্টের সব প্যাকেজ এবং লাইব্রেরি ডিপেনডেন্সি সংরক্ষণ করে।

9. Dockerfile:

এটি Docker কনটেইনারে অ্যাপ্লিকেশন রান করার জন্য কনফিগারেশন ফাইল।

10. README.md:

এই ফাইলটি প্রজেক্টের সারাংশ এবং সেটআপ নির্দেশনা রাখে।


Clean Code Practices in FastAPI

  1. Modularization: বড় প্রজেক্টে কোডকে ছোট মডিউলে ভাগ করা, যেমন রাউট, সার্ভিস, মডেল, স্কিমা ইত্যাদি আলাদা ফোল্ডারে রাখা।
  2. Naming Conventions: ফাইল, ফোল্ডার এবং ভেরিয়েবল নামকরণ পরিষ্কার এবং ডেসক্রিপটিভ হওয়া উচিত।
  3. Avoiding Repetition: একই কোড পুনরাবৃত্তি থেকে বিরত থাকা। DRY (Don't Repeat Yourself) প্রিন্সিপাল অনুসরণ করা।
  4. Separation of Concerns: রাউট, লজিক, ডাটাবেস ইন্টারঅ্যাকশন এবং ভ্যালিডেশন আলাদা আলাদা ফাইল বা ক্লাসে রাখা।
  5. Error Handling: Proper error handling ব্যবহার করা, যেমন custom exceptions তৈরি করা এবং সার্ভিস বা কন্ট্রোলার লেভেলে try-except ব্লক ব্যবহার করা।

Clean Code Structure এবং Proper Project Organization FastAPI প্রজেক্টে গুরুত্বপূর্ণ ভূমিকা পালন করে। এটি কোডকে পড়া এবং মেইনটেন্যান্স করতে সহজ করে তোলে। সঠিক ফোল্ডার স্ট্রাকচার এবং প্রফেশনাল কোড গঠন ডেভেলপারদের জন্য বড় প্রজেক্টে কাজ করা অনেক সহজ এবং স্কেলেবল হয়ে ওঠে।

Content added By

RESTful API Design Best Practices

232

RESTful API ডিজাইন করার সময় কিছু গুরুত্বপূর্ণ best practices অনুসরণ করা উচিত, যাতে আপনার API সুসংগঠিত, কার্যকরী, নিরাপদ এবং স্কেলেবল হয়। FastAPI তে এই best practices অনুসরণ করা খুবই সহজ, কারণ এটি আধুনিক Python ফ্রেমওয়ার্ক, যা বিভিন্ন ধরনের API ডিজাইন করতে সাহায্য করে।

এখানে RESTful API Design Best Practices নিয়ে বিস্তারিত আলোচনা করা হলো।


1. Proper HTTP Methods (GET, POST, PUT, DELETE)

RESTful API তে প্রতিটি HTTP মেথডের নিজস্ব উদ্দেশ্য থাকে। HTTP মেথডগুলোকে সঠিকভাবে ব্যবহার করা খুবই গুরুত্বপূর্ণ।

  • GET: ডাটা রিড করার জন্য।
  • POST: নতুন রিসোর্স তৈরি করার জন্য।
  • PUT: বিদ্যমান রিসোর্স আপডেট করার জন্য।
  • DELETE: রিসোর্স মুছে ফেলার জন্য।

উদাহরণ:

@app.get("/items/")
async def get_items():
    return {"message": "Get all items"}

@app.post("/items/")
async def create_item(item: Item):
    return {"message": "Item created", "item": item}

@app.put("/items/{item_id}")
async def update_item(item_id: int, item: Item):
    return {"message": f"Item {item_id} updated", "item": item}

@app.delete("/items/{item_id}")
async def delete_item(item_id: int):
    return {"message": f"Item {item_id} deleted"}

2. Use of Resource Nouns

API এর URL পাথগুলোতে resource nouns ব্যবহার করুন, এবং verbs না ব্যবহার করুন। পাথগুলো সাধারণত noun এর মতো হতে হবে এবং HTTP মেথড এর মাধ্যমে কাজটি নির্ধারণ করা উচিত।

  • সঠিক: /items/, /users/{user_id}
  • ভুল: /get_items/, /create_user/

উদাহরণ:

@app.get("/items/{item_id}")
async def get_item(item_id: int):
    return {"message": f"Item {item_id}"}

3. Use Status Codes Properly

HTTP স্ট্যাটাস কোড ব্যবহার করা খুবই গুরুত্বপূর্ণ। FastAPI তে আপনি HTTPException এর মাধ্যমে স্ট্যাটাস কোড কাস্টমাইজ করতে পারেন।

  • 200 OK: সফল GET, PUT, PATCH, বা DELETE রিকোয়েস্ট।
  • 201 Created: সফল POST রিকোয়েস্ট যখন নতুন রিসোর্স তৈরি হয়।
  • 400 Bad Request: রিকোয়েস্টের ইনপুট ভুল।
  • 404 Not Found: রিসোর্স পাওয়া যায়নি।
  • 500 Internal Server Error: সার্ভারের একটি ত্রুটি।

উদাহরণ:

from fastapi import HTTPException

@app.post("/items/")
async def create_item(item: Item):
    if not item.name:
        raise HTTPException(status_code=400, detail="Item name is required")
    return {"message": "Item created successfully", "item": item}

4. Consistent Naming Conventions

URL পাথ এবং অন্যান্য API রিসোর্সের নামের জন্য consistent naming conventions অনুসরণ করা উচিত। এই naming conventions API ব্যবহারকারীকে সহজেই বুঝতে সাহায্য করে।

  • পাথগুলো সাধারণত plural হতে উচিত, যেমন /items/ বা /users/
  • পাথ এবং ফিল্ডের নামের জন্য lowercase ব্যবহার করুন এবং শব্দগুলোর মধ্যে hyphen (-) ব্যবহার করুন। যেমন: /user-details/, /order-items/

উদাহরণ:

@app.get("/users/")
async def get_users():
    return {"message": "Get all users"}

5. Provide Clear and Detailed Documentation

FastAPI স্বয়ংক্রিয়ভাবে Swagger UI এবং ReDoc ডকুমেন্টেশন জেনারেট করে, কিন্তু এর পাশাপাশি API রুট এবং প্যারামিটারগুলির জন্য বিস্তারিত বর্ণনা প্রদান করা উচিত।

উদাহরণ:

@app.get("/items/", response_model=List[Item], summary="Get all items", description="Retrieve all items from the inventory.")
async def get_items():
    return {"message": "All items retrieved"}

এইভাবে, summary এবং description ব্যবহার করে API ডকুমেন্টেশনকে আরও বিস্তারিত এবং পরিষ্কার করা যায়।


6. Validation and Error Handling

সব ইনপুটের জন্য ভ্যালিডেশন নিশ্চিত করতে হবে এবং ত্রুটির ক্ষেত্রে প্রাসঙ্গিক ত্রুটি বার্তা প্রদান করতে হবে। FastAPI তে Pydantic মডেল এবং HTTPException এর মাধ্যমে এটি করা সম্ভব।

  • ইনপুট ডাটা ভ্যালিডেশন নিশ্চিত করতে Pydantic Models ব্যবহার করুন।
  • HTTPException ব্যবহার করে সঠিক স্ট্যাটাস কোড এবং ত্রুটি বার্তা ফেরত দিন।

উদাহরণ:

from pydantic import BaseModel, Field
from fastapi import HTTPException

class Item(BaseModel):
    name: str = Field(..., min_length=3)
    price: float

@app.post("/items/")
async def create_item(item: Item):
    if item.price <= 0:
        raise HTTPException(status_code=400, detail="Price must be greater than zero.")
    return {"message": "Item created successfully", "item": item}

এখানে, Item মডেল ব্যবহার করা হয়েছে এবং price ফিল্ডের জন্য ভ্যালিডেশন করা হয়েছে।


7. Handle Pagination

বড় ডেটা সেটের জন্য pagination ব্যবহার করা উচিত। এটি আপনাকে অনেক বড় ডেটাবেস কলের মধ্যে শুধুমাত্র একটি অংশ রিটার্ন করতে সহায়তা করে, যার ফলে সার্ভার পারফরম্যান্স উন্নত হয়।

উদাহরণ:

@app.get("/items/")
async def get_items(skip: int = 0, limit: int = 10):
    items = db.query(Item).offset(skip).limit(limit).all()
    return items

এখানে, skip এবং limit কোয়েরি প্যারামিটার ব্যবহার করে pagination বাস্তবায়িত করা হয়েছে।


8. Use of Authentication and Authorization

API এর নিরাপত্তার জন্য authentication এবং authorization খুবই গুরুত্বপূর্ণ। FastAPI তে OAuth2, JWT, বা Basic Authentication সাপোর্ট রয়েছে। API তে সঠিক নিরাপত্তা ব্যবস্থা রাখতে হবে যেন শুধুমাত্র অনুমোদিত ব্যবহারকারীই সঠিক ডাটা অ্যাক্সেস করতে পারে।

উদাহরণ: JWT Authentication

from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
import jwt

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")

def verify_token(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, "secret_key", algorithms=["HS256"])
        return payload
    except jwt.PyJWTError:
        raise HTTPException(status_code=401, detail="Invalid authentication credentials")

এখানে JWT ব্যবহার করা হয়েছে OAuth2PasswordBearer এর সাথে।


9. Versioning the API

API এর versioning খুবই গুরুত্বপূর্ণ, যাতে ভবিষ্যতে API পরিবর্তন করা হলে পুরানো সংস্করণের ব্যবহারকারীরা সমস্যা না ভোগে। সাধারণত URL versioning বা Accept header versioning ব্যবহার করা হয়।

উদাহরণ: URL versioning

@app.get("/v1/items/")
async def get_items_v1():
    return {"message": "This is API version 1"}

এখানে, API এর v1 সংস্করণ উল্লেখ করা হয়েছে।


10. Rate Limiting

API-এর জন্য rate limiting ব্যবহার করা উচিত, যাতে সার্ভারের উপর অতিরিক্ত লোড না পড়ে এবং একটি ব্যবহারকারী খুব বেশি রিকোয়েস্ট না করতে পারে। FastAPI তে rate-limiter বা fastapi-limiter এর মতো লাইব্রেরি ব্যবহার করা যায়।


FastAPI-তে RESTful API ডিজাইন করার সময় এই best practices অনুসরণ করলে আপনার API-টি ব্যবহারকারী-বান্ধব, নিরাপদ এবং স্কেলেবল হবে। সঠিক HTTP মেথড, স্ট্যাটাস কোড, ডকুমেন্টেশন, ইনপুট ভ্যালিডেশন, pagination, নিরাপত্তা এবং versioning এর মাধ্যমে আপনি একটি শক্তিশালী এবং নির্ভরযোগ্য API তৈরি করতে পারবেন। FastAPI এর ক্ষমতা এবং আধুনিক ফিচারগুলোর সাহায্যে আপনি খুব সহজেই এই best practices বাস্তবায়ন করতে পারবেন।

Content added By

API Documentation কাস্টমাইজেশন (Swagger এবং ReDoc)

208

FastAPI স্বয়ংক্রিয়ভাবে API Documentation তৈরি করে, যা Swagger UI এবং ReDoc মাধ্যমে খুবই সুন্দরভাবে প্রদর্শিত হয়। FastAPI এর OpenAPI স্পেসিফিকেশন ব্যবহার করে এই ডকুমেন্টেশন তৈরি করা হয়। আপনি API ডকুমেন্টেশনের শিরোনাম, বিবরণ, এবং অন্যান্য অংশ কাস্টমাইজ করতে পারেন। এখানে আমরা দেখব কিভাবে Swagger UI এবং ReDoc কাস্টমাইজ করা যায়।


Step 1: FastAPI অ্যাপ তৈরি করা

প্রথমে একটি সাধারণ FastAPI অ্যাপ তৈরি করি, যাতে API Documentation দেখা যাবে।

উদাহরণ: main.py

from fastapi import FastAPI

app = FastAPI(
    title="My FastAPI Application",
    description="This is a simple FastAPI application to demonstrate API Documentation customization.",
    version="1.0.0"
)

@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI!"}

এখানে, FastAPI কনস্ট্রাক্টরটি title, description, এবং version প্যারামিটার ব্যবহার করে API ডকুমেন্টেশন কাস্টমাইজ করা হয়েছে। এর ফলে Swagger UI এবং ReDoc ডকুমেন্টেশন শিরোনাম এবং বিবরণ কাস্টমাইজড হবে।


Step 2: Swagger UI কাস্টমাইজেশন

FastAPI স্বয়ংক্রিয়ভাবে Swagger UI তৈরি করে এবং এটি http://127.0.0.1:8000/docs এ পাওয়া যায়। আপনি Swagger UI এর শিরোনাম, বিবরণ এবং অন্যান্য তথ্য কাস্টমাইজ করতে পারেন।

কাস্টম Swagger UI:

from fastapi import FastAPI

app = FastAPI(
    title="My Custom FastAPI",
    description="This is a custom FastAPI application to demonstrate Swagger UI customization.",
    version="1.0.1",
    docs_url="/docs"  # Swagger UI কাস্টম URL
)

@app.get("/")
def read_root():
    return {"message": "Hello, Custom FastAPI!"}
  • docs_url: Swagger UI এর জন্য কাস্টম URL সেট করতে ব্যবহার করা হয়। এখানে /docs ব্যবহার করা হয়েছে, যা ডিফল্টও থাকে।

এখন আপনি ব্রাউজারে গিয়ে http://127.0.0.1:8000/docs URL তে কাস্টম Swagger UI দেখতে পাবেন।


Step 3: ReDoc কাস্টমাইজেশন

FastAPI এছাড়াও ReDoc এর মাধ্যমে API ডকুমেন্টেশন সরবরাহ করে, যা সুন্দরভাবে এবং বিস্তারিতভাবে API এর তথ্য দেখায়। আপনি ReDoc এর জন্য কাস্টম URL এবং তথ্য সেট করতে পারেন।

কাস্টম ReDoc:

from fastapi import FastAPI

app = FastAPI(
    title="FastAPI with ReDoc",
    description="A simple FastAPI application with customized ReDoc documentation.",
    version="1.0.1",
    redoc_url="/redoc"  # ReDoc UI কাস্টম URL
)

@app.get("/")
def read_root():
    return {"message": "Hello, FastAPI with ReDoc!"}
  • redoc_url: ReDoc এর জন্য কাস্টম URL সেট করতে ব্যবহৃত হয়। এখানে /redoc ব্যবহার করা হয়েছে।

এখন আপনি ব্রাউজারে গিয়ে http://127.0.0.1:8000/redoc URL তে কাস্টম ReDoc ডকুমেন্টেশন দেখতে পাবেন।


Step 4: API Documentation কাস্টম ফিচারসমূহ

FastAPI এর মাধ্যমে API ডকুমেন্টেশনের শিরোনাম, বিবরণ, এবং বিভিন্ন অংশ কাস্টমাইজ করার আরও কিছু অপশন রয়েছে।

কাস্টম ডকুমেন্টেশন ফিচার:

  1. এন্ডপয়েন্ট ডকুমেন্টেশন কাস্টমাইজেশন: প্রতিটি API এন্ডপয়েন্টের জন্য summary এবং description যুক্ত করতে পারেন।

    @app.get("/items/{item_id}", summary="Get an item", description="Retrieve an item by its ID.")
    def get_item(item_id: int):
        return {"item_id": item_id}
    

    এখানে:

    • summary: এন্ডপয়েন্টের সংক্ষিপ্ত বর্ণনা।
    • description: এন্ডপয়েন্টের বিস্তারিত বর্ণনা।
  2. Request Body Example: আপনি প্যারামিটার বা Request Body এর জন্য উদাহরণ যুক্ত করতে পারেন।

    from pydantic import BaseModel
    
    class Item(BaseModel):
        name: str
        description: str | None = None
        price: float
        tax: float | None = None
    
    @app.post("/items/", response_model=Item)
    def create_item(item: Item):
        return item
    

    Swagger UI এবং ReDoc এই Item মডেলের জন্য স্বয়ংক্রিয়ভাবে Example দেখাবে।

  3. Response Model Example: প্রতিটি response_model এর জন্য একটি উদাহরণ যুক্ত করতে পারেন।

    @app.get("/items/{item_id}", response_model=Item)
    def get_item(item_id: int):
        return {"item_id": item_id, "name": "Example Item", "price": 123.45}
    

Step 5: OpenAPI কাস্টমাইজেশন

FastAPI এর OpenAPI স্পেসিফিকেশন কাস্টমাইজ করা সম্ভব, যা Swagger UI এবং ReDoc এর পিছনে কাজ করে। আপনি OpenAPI এর শিরোনাম, বিবরণ এবং আরও অনেক কিছু কাস্টমাইজ করতে পারেন।

কাস্টম OpenAPI:

from fastapi import FastAPI
from fastapi.openapi.models import OpenAPI

app = FastAPI(
    title="Custom OpenAPI Example",
    description="A FastAPI application with custom OpenAPI",
    version="1.0.1",
)

@app.get("/openapi")
async def get_openapi():
    openapi_schema = app.openapi()
    openapi_schema["info"]["title"] = "Custom OpenAPI Title"
    openapi_schema["info"]["description"] = "This is a custom description"
    return openapi_schema

এখানে:

  • app.openapi(): FastAPI এর স্বয়ংক্রিয় OpenAPI স্পেসিফিকেশন।
  • আপনি openapi_schema["info"] এর মাধ্যমে শিরোনাম, বিবরণ, এবং অন্যান্য তথ্য কাস্টমাইজ করতে পারেন।

Step 6: বন্ধুত্বপূর্ণ ডকুমেন্টেশন

FastAPI নিজে থেকে অটোমেটিক Swagger UI এবং ReDoc ডকুমেন্টেশন সরবরাহ করে, তবে আপনি চাইলে API Key এর মাধ্যমে নিরাপত্তা সংক্রান্ত ব্যবস্থা, OAuth2 এর মতো সিকিউরিটি মেকানিজম বা কাস্টম ফিচার যোগ করতে পারেন।


FastAPI তে Swagger UI এবং ReDoc এর মাধ্যমে API ডকুমেন্টেশন কাস্টমাইজেশন খুবই সহজ এবং শক্তিশালী। আপনি API ডকুমেন্টেশনকে আপনার প্রয়োজন অনুযায়ী কাস্টমাইজ করতে পারেন, যেমন শিরোনাম, বিবরণ, উদাহরণ, এবং অন্যান্য তথ্য কাস্টমাইজ করতে। FastAPI এর সাথে আপনি খুব সহজে ডেভেলপমেন্টের সময় API ডকুমেন্টেশনকে স্বয়ংক্রিয়ভাবে তৈরি এবং কাস্টমাইজ করতে পারবেন।

Content added By

Large Scale FastAPI অ্যাপ্লিকেশন তৈরি

203

FastAPI একটি আধুনিক এবং দ্রুত ওয়েব ফ্রেমওয়ার্ক যা উচ্চ পারফরম্যান্স এবং দ্রুত ডেভেলপমেন্টের জন্য ডিজাইন করা হয়েছে। যখন আপনি একটি বড় স্কেল FastAPI অ্যাপ্লিকেশন তৈরি করবেন, তখন আপনাকে কিছু কৌশল এবং সেরা অভ্যাস অনুসরণ করতে হবে যাতে অ্যাপ্লিকেশনটি স্কেলেবল, পোর্টেবল, এবং রক্ষণাবেক্ষণযোগ্য হয়।

এখানে আমরা দেখব কিভাবে একটি Large Scale FastAPI অ্যাপ্লিকেশন তৈরি করা যেতে পারে। এটি সঠিক ফোল্ডার স্ট্রাকচার, ডাটাবেস ডিজাইন, API রাউটিং, অডিট লোগিং, টেস্টিং, এবং আরও অনেক কিছু নিয়ে আলোচনা করবে।


Step 1: প্রজেক্ট স্ট্রাকচার ডিজাইন করা

একটি বড় স্কেল অ্যাপ্লিকেশনের জন্য ফোল্ডার স্ট্রাকচার পরিষ্কার এবং মডুলার হওয়া জরুরি। এতে আপনার অ্যাপ্লিকেশন সহজে স্কেল এবং রক্ষণাবেক্ষণযোগ্য থাকবে।

উদাহরণ: FastAPI অ্যাপ্লিকেশনের স্ট্রাকচার

my_large_fastapi_project/
├── app/
│   ├── main.py          # FastAPI অ্যাপ শুরু
│   ├── models/          # ডাটাবেস মডেলস
│   ├── schemas/         # Pydantic schemas (input/output)
│   ├── api/             # API রাউটস
│   │   ├── __init__.py
│   │   ├── users.py     # User রাউট
│   │   └── items.py     # Item রাউট
│   ├── crud/            # CRUD অপারেশন
│   ├── core/            # অ্যাপের মূল কনফিগারেশন
│   ├── db/              # ডাটাবেস কনফিগারেশন
│   ├── services/        # অতিরিক্ত সার্ভিস লজিক
│   ├── __init__.py
├── requirements.txt     # ডিপেনডেন্সি
├── .env                 # পরিবেশ ভেরিয়েবল
├── alembic/             # মাইগ্রেশন ফাইল (SQLAlchemy)
└── tests/               # টেস্ট কেস

ফোল্ডার স্ট্রাকচারের ব্যাখ্যা:

  • main.py: FastAPI অ্যাপ শুরু এবং কনফিগারেশন।
  • models/: ডাটাবেস মডেলস, যেখানে ডাটাবেস স্কিমা থাকে।
  • schemas/: Pydantic models যা ইনপুট এবং আউটপুট ভ্যালিডেশন করে।
  • api/: API রাউটস বা এন্ডপয়েন্ট। প্রতিটি মডিউল আলাদা ফাইল হিসেবে থাকে (যেমন, users.py, items.py)।
  • crud/: ডাটাবেস অপারেশন যেমন Create, Read, Update, Delete।
  • core/: অ্যাপ কনফিগারেশন এবং অন্যান্য মৌলিক কনফিগারেশন (যেমন লগিং, সিকিউরিটি)।
  • db/: ডাটাবেস কনফিগারেশন এবং সংযোগ।
  • services/: অতিরিক্ত লজিক বা সার্ভিস। এখানে আপনি বাহ্যিক API কল, ইমেইল পাঠানো, এবং অন্যান্য লজিক রাখতে পারেন।

Step 2: ডাটাবেস সংযোগ এবং মডেল ডিজাইন

SQLAlchemy বা Tortoise ORM দিয়ে ডাটাবেস মডেল ডিজাইন করা হয়। এখানে আমরা SQLAlchemy ব্যবহার করছি।

উদাহরণ: SQLAlchemy মডেল

# app/models/item.py
from sqlalchemy import Column, Integer, String, Float
from app.db import Base

class Item(Base):
    __tablename__ = 'items'

    id = Column(Integer, primary_key=True, index=True)
    name = Column(String, index=True)
    description = Column(String)
    price = Column(Float)

ডাটাবেস কনফিগারেশন:

# app/db.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker

SQLALCHEMY_DATABASE_URL = "sqlite:///./test.db"

engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()

এখানে, SessionLocal হল ডাটাবেস সেশন তৈরির জন্য ব্যবহৃত মেথড, এবং Base হল সমস্ত মডেলের বেস ক্লাস।


Step 3: CRUD অপারেশন ডিজাইন

CRUD (Create, Read, Update, Delete) অপারেশন ডিজাইন করার জন্য, আমরা CRUD ফোল্ডারে আলাদা ফাইল তৈরি করব যা ডাটাবেস অপারেশনগুলির সাথে সম্পর্কিত হবে।

উদাহরণ: CRUD অপারেশন

# app/crud/item.py
from sqlalchemy.orm import Session
from app.models.item import Item
from app.schemas.item import ItemCreate

def create_item(db: Session, item: ItemCreate):
    db_item = Item(name=item.name, description=item.description, price=item.price)
    db.add(db_item)
    db.commit()
    db.refresh(db_item)
    return db_item

Pydantic স্কিমা:

# app/schemas/item.py
from pydantic import BaseModel

class ItemBase(BaseModel):
    name: str
    description: str | None = None
    price: float

class ItemCreate(ItemBase):
    pass

class Item(ItemBase):
    id: int

    class Config:
        orm_mode = True

ItemCreate স্কিমা ব্যবহারকারী থেকে ডাটা গ্রহণের জন্য এবং Item স্কিমা ডাটাবেস থেকে ফেরত আসা আইটেমের জন্য।


Step 4: API রাউটস এবং Endpoints

আমরা /users, /items ইত্যাদি বিভিন্ন এন্ডপয়েন্ট তৈরি করব এবং রাউট করতে APIRouter ব্যবহার করব।

উদাহরণ: API রাউট

# app/api/items.py
from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from app import crud, schemas, models
from app.db import SessionLocal

router = APIRouter()

def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@router.post("/items/", response_model=schemas.Item)
def create_item(item: schemas.ItemCreate, db: Session = Depends(get_db)):
    return crud.create_item(db=db, item=item)

এখানে, create_item ফাংশন ব্যবহারকারী থেকে ইনপুট নিয়ে ডাটাবেসে আইটেম তৈরি করে। Depends(get_db) ডাটাবেস সেশন গ্রহণ করে।


Step 5: ডিপেনডেন্সি ইনজেকশন এবং রাউটস

একটি বড় অ্যাপ্লিকেশন পরিচালনা করতে Dependency Injection ব্যবহার করা খুবই কার্যকর। এটি কোডের পুনরায় ব্যবহারযোগ্যতা এবং পরীক্ষণযোগ্যতা (testability) বাড়ায়।

FastAPI ডিপেনডেন্সি ইনজেকশনের মাধ্যমে, যেমন ডাটাবেস সেশন এবং সার্ভিস লজিক ইনজেক্ট করা যায়।


Step 6: টেস্টিং

FastAPI স্বয়ংক্রিয়ভাবে OpenAPI স্পেসিফিকেশন তৈরি করে, যা Swagger UI এবং ReDoc দ্বারা টেস্ট করা যেতে পারে।

টেস্টিং এর উদাহরণ:

# tests/test_item.py
from fastapi.testclient import TestClient
from app.main import app

client = TestClient(app)

def test_create_item():
    response = client.post("/items/", json={"name": "Item 1", "price": 20.0})
    assert response.status_code == 200
    assert response.json() == {"name": "Item 1", "price": 20.0, "id": 1}

Step 7: ডিপ্লয়মেন্ট

  1. Docker Integration: Dockerfile ব্যবহার করে অ্যাপ কনটেইনারাইজড করে ডিপ্লয় করা যায়।
  2. Heroku/AWS/GCP: Heroku, AWS, অথবা Google Cloud Platform-এ FastAPI অ্যাপ ডিপ্লয় করা যেতে পারে।

একটি বড় স্কেল FastAPI অ্যাপ্লিকেশন তৈরি করতে হলে মডুলার অ্যাপ স্ট্রাকচার, ডাটাবেস ডিজাইন, CRUD অপারেশন, ডিপেনডেন্সি ইনজেকশন এবং টেস্টিং ব্যবহার করা জরুরি। FastAPI এর সাহায্যে খুব দ্রুত স্কেলেবল এবং পোর্টেবল অ্যাপ্লিকেশন তৈরি করা সম্ভব, যা প্রোডাকশনে উচ্চ পারফরম্যান্স সরবরাহ করে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...